package com.hilinos.common.util;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Ehcache;
import net.sf.ehcache.config.CacheConfiguration;
import net.sf.ehcache.store.MemoryStoreEvictionPolicy;

public class CacheUtils {

    private static final CacheManager CACHE_MANAGER = CacheManager.create();

    /**
     * 创建缓存
     *
     * @param cacheName         缓存名称
     * @param timeToLiveSeconds 元素最大生存时间，0代表无限制
     * @param timeToIdleSeconds 元素最大闲置时间，0代表无限制
     * @return 缓存
     */
    public static synchronized Ehcache createAndGetCache(String cacheName, int maxElements, long timeToLiveSeconds, long timeToIdleSeconds) {
        Ehcache cache = CACHE_MANAGER.getEhcache(cacheName);
        if (cache == null) {
            cache = new Cache(new CacheConfiguration(cacheName, maxElements)
                    // 清理机制：LRU最近最少使用 FIFO先进先出 LFU较少使用
                    .memoryStoreEvictionPolicy(MemoryStoreEvictionPolicy.LFU)
                    // 元素最大生存时间，0代表无限制
                    .timeToLiveSeconds(timeToLiveSeconds)
                    // 元素最大闲置时间，0代表无限制
                    .timeToIdleSeconds(timeToIdleSeconds)
                    .eternal(false));
            CACHE_MANAGER.addCache(cache);
        }
        return cache;
    }

}
